/**
 * 将一个数组分割成多个指定大小的块。这个函数接受一个数组和一个指定的块大小，然后返回一个二维数组。
 * 每个子数组包含原数组中的一部分元素，大小由 `chunkSize` 参数决定。
 * 如果数组的长度不是 `chunkSize` 的整数倍，最后一个块可能包含的元素少于 `chunkSize`。
 *
 * @param array  要分割的源数组。
 * @param chunkSize  每个块的大小。必须为正整数。默认值为 1。
 * @returns 返回一个二维数组，每个子数组是原数组的一部分元素。
 */
function chunkArray<T>(array: T[], chunkSize: number = 1): T[][] {
  // 检查 chunkSize 参数是否为零
  if (chunkSize === 0) {
    throw new Error('块大小不能为 0')
  }
  // 检查 chunkSize 参数是否小于零
  if (chunkSize < 0) {
    throw new Error('块大小不能为负数')
  }

  // 原数组为空，直接返回一个空数组
  if (array.length === 0) {
    return []
  }

  // 初始化一个空数组来存储分割后的块
  const chunks: T[][] = []
  // 使用 for 循环按 chunkSize 步长遍历数组
  for (let i = 0; i < array.length; i += chunkSize) {
    // 使用 slice 方法提取从索引 i 开始的 chunkSize 个元素
    // 如果 i + chunkSize 超出数组长度，slice 方法将返回到数组末尾
    chunks.push(array.slice(i, i + chunkSize))
  }
  // 返回包含所有块的二维数组
  return chunks
}

export { chunkArray }
